home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
public
/
dbmalloc
/
size.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
3KB
|
144 lines
/*
* (c) Copyright 1990, 1991, 1992 Conor P. Cahill (cpcahil@virtech.vti.com)
*
* This software may be distributed freely as long as the following conditions
* are met:
* * the distribution, or any derivative thereof, may not be
* included as part of a commercial product
* * full source code is provided including this copyright
* * there is no charge for the software itself (there may be
* a minimal charge for the copying or distribution effort)
* * this copyright notice is not modified or removed from any
* source file
*/
#include <stdio.h>
#include "mallocin.h"
#include "debug.h"
/*
* Function: malloc_size()
*
* Purpose: return the size of the allocated segment associated with ptr
*
* Arguments: ptr - pointer to allocated area
*
* Returns: the size of the segment
*
* Narrative:
* verify pointer is within malloc region
* get mlist pointer from passed address
* verify magic number
* verify inuse flag
* verify pointer connections with surrounding segments
* return size of segment
*/
#ifndef lint
static
char rcs_hdr[] = "$Id: size.c,v 1.4 1992/08/22 16:27:13 cpcahil Exp $";
#endif
SIZETYPE
malloc_size(cptr)
CONST DATATYPE * cptr;
{
return( DBmalloc_size((char *)NULL, 0, cptr) );
}
SIZETYPE
DBmalloc_size(file,line,cptr)
CONST char * file;
int line;
CONST DATATYPE * cptr;
{
char * func = "malloc_size";
register struct mlist * ptr;
/*
* initialize the malloc sub-system.
*/
MALLOC_INIT();
/*
* IF malloc chain checking is on, go do it.
*/
if( malloc_opts & MOPT_CKCHAIN )
{
VOIDCAST DBFmalloc_chain_check(func,file,line,1);
}
/*
* verify that cptr is within the malloc region and that it is on
* the correct alignment
*/
if( (cptr < malloc_data_start)
|| (cptr > malloc_data_end)
|| ((((long)cptr) & malloc_round) != 0) )
{
malloc_errno = M_CODE_BAD_PTR;
malloc_warning(func,file,line,(struct mlist *)NULL);
return( (SIZETYPE) -1);
}
/*
* convert pointer to mlist struct pointer. To do this we must
* move the pointer backwards the correct number of bytes...
*/
ptr = DATATOMLIST(cptr);
/*
* check the magic number
*/
if( (ptr->flag&M_MAGIC_BITS) != M_MAGIC )
{
malloc_errno = M_CODE_BAD_MAGIC;
malloc_warning(func,file,line,(struct mlist *)NULL);
return((SIZETYPE) -1);
}
/*
* if this segment is not flagged as being in use
*/
if( ! (ptr->flag & M_INUSE) )
{
malloc_errno = M_CODE_NOT_INUSE;
malloc_warning(func,file,line,ptr);
return( (SIZETYPE) -1 );
}
/*
* check to see that the pointers are still connected
*/
if( (ptr->prev && (ptr->prev->next != ptr) ) ||
(ptr->next && (ptr->next->prev != ptr) ) ||
((ptr->next == NULL) && (ptr->prev == NULL)) )
{
malloc_errno = M_CODE_BAD_CONNECT;
malloc_warning(func,file,line,ptr);
return( (SIZETYPE) -1 );
}
/*
* check fill regions for overflow
*/
VOIDCAST FILLCHECK(func,file,line,ptr,SHOWERRORS);
return(ptr->r_size);
} /* DBmalloc_size(... */
/*
* $Log: size.c,v $
* Revision 1.4 1992/08/22 16:27:13 cpcahil
* final changes for pl14
*
* Revision 1.3 1992/07/03 00:03:25 cpcahil
* more fixes for pl13, several suggestons from Rich Salz.
*
* Revision 1.2 1992/07/02 15:35:52 cpcahil
* misc cleanups for PL13
*
* Revision 1.1 1992/07/02 13:49:54 cpcahil
* added support for new malloc_size function and additional tests to testerr
*
*/